/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.scrumpmt.web.producto;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.primefaces.model.DualListModel;
import org.scrumpmt.domain.Colaborador;
import org.scrumpmt.domain.Proyecto;
import org.scrumpmt.ejb.ColaboradorFacade;
import org.scrumpmt.ejb.ProyectoFacade;
import org.scrumpmt.web.BasicBean;
import org.scrumpmt.web.login;

/**
 *
 * @author aljiru
 */
@ManagedBean
@RequestScoped
public class EditarProductoBean extends BasicBean {

    private ProyectoFacade proyectoFacade = lookupProyectoFacade();
    private ColaboradorFacade colaboradorFacade = lookupColaboradorFacade();
    @ManagedProperty(value = "#{param.id}")
    private String id;
    private Proyecto proyecto;
    private String colaborador;
    private DualListModel<Colaborador> colaboradores;
    private login bean = null;
    private FacesContext context = null;

    /**
     * Creates a new instance of EditarProductoBean
     */
    public EditarProductoBean() {
        context = FacesContext.getCurrentInstance();
        if (context != null) {
            bean = (login) context.getApplication().evaluateExpressionGet(context, "#{login}", login.class);
        }
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Proyecto getProyecto() {
        return proyecto;
    }

    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    public String getColaborador() {
        return colaborador;
    }

    public void setColaborador(String colaborador) {
        this.colaborador = colaborador;
    }

    public DualListModel<Colaborador> getColaboradores() {
        return colaboradores;
    }

    public void setColaboradores(DualListModel<Colaborador> colaboradores) {
        this.colaboradores = colaboradores;
    }

    public String editar() {
        Proyecto pro = proyectoFacade.find(Long.parseLong(id));
        if (pro.getNombre() != null && proyecto.getDes() != null && proyecto.getFecini() != null && proyecto.getFecfin() != null && proyecto.getNomcli() != null && colaborador != null) {
            pro.setNombre(proyecto.getNombre());
            pro.setDes(proyecto.getDes());
            pro.setFecini(proyecto.getFecini());
            pro.setFecfin(proyecto.getFecfin());
            pro.setNomcli(proyecto.getNomcli());
            pro.setHorasJornada(proyecto.getHorasJornada());
            Colaborador col = null;
            if (context != null) {
                col = colaboradorFacade.findByNombre(colaborador);
            } else {
                col = colaboradorFacade.find(new Long(colaborador));
            }
            pro.setIdScrumMaster(col);
            pro.setActivo(1);

            List<Colaborador> usuarios = null;
            if (context != null) {
                usuarios = new ArrayList<Colaborador>();

                for (Colaborador c : colaboradores.getSource()) {
                    Colaborador usuario = colaboradorFacade.find(new Long(c.getId()));
                    usuarios.add(usuario);
                    Collection<Proyecto> proyectos = usuario.getProyectoCollection();
                    proyectos.remove(pro);
                    usuario.setProyectoCollection(proyectos);
                }

                Collection<Colaborador> Ccolaboradores = pro.getColaboradorCollection();
                Ccolaboradores.clear();
                for (Colaborador c : colaboradores.getTarget()) {
                    Ccolaboradores.add(c);
                    Colaborador usuario = colaboradorFacade.find(new Long(c.getId()));
                    usuarios.add(usuario);
                    Collection<Proyecto> proyectos = usuario.getProyectoCollection();
                    proyectos.add(pro);
                    usuario.setProyectoCollection(proyectos);
                }
                pro.setColaboradorCollection(Ccolaboradores);
            }

            proyectoFacade.edit(pro);
            if (context != null) {
                for (Colaborador usuario : usuarios) {
                    colaboradorFacade.edit(usuario);
                }
            }

            return ("listado");
        }
        return "";
    }

    private ColaboradorFacade lookupColaboradorFacade() {
        try {
            Context c = new InitialContext();
            return (ColaboradorFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/ColaboradorFacade!org.scrumpmt.ejb.ColaboradorFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private ProyectoFacade lookupProyectoFacade() {
        try {
            Context c = new InitialContext();
            return (ProyectoFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/ProyectoFacade!org.scrumpmt.ejb.ProyectoFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    @PostConstruct
    public void cargaProducto() {
        if (id != null && !id.equals("")) {
            proyecto = proyectoFacade.find(Long.parseLong(id));
            Collection<Colaborador> colsProd = proyecto.getColaboradorCollection();

            List<Colaborador> cs = colaboradorFacade.findAll();
            //Colaboradores
            List<Colaborador> source = new ArrayList<Colaborador>();
            List<Colaborador> target = new ArrayList<Colaborador>();

            for (Colaborador c : cs) {
                if (colsProd.contains(c)) {
                    target.add(c);
                } else {
                    source.add(c);
                }
            }

            colaboradores = new DualListModel<Colaborador>(source, target);
        } else {
            proyecto = new Proyecto();
        }

    }

    public void editarAsociados(List<Colaborador> colabAsociados, List<Colaborador> colabNoAsociados, String proyectoID) {
        Proyecto pro = proyectoFacade.find(Long.parseLong(proyectoID));
        List<Colaborador> usuarios = null;
        usuarios = new ArrayList<Colaborador>();

        for (Colaborador c : colabNoAsociados) {
            Colaborador usuario = colaboradorFacade.find(new Long(c.getId()));
            usuarios.add(usuario);
            Collection<Proyecto> proyectos = usuario.getProyectoCollection();
            proyectos.remove(pro);
            usuario.setProyectoCollection(proyectos);
        }

        Collection<Colaborador> Ccolaboradores = pro.getColaboradorCollection();
        Ccolaboradores.clear();
        for (Colaborador c : colabAsociados) {
            Ccolaboradores.add(c);
            Colaborador usuario = colaboradorFacade.find(new Long(c.getId()));
            usuarios.add(usuario);
            Collection<Proyecto> proyectos = usuario.getProyectoCollection();
            proyectos.add(pro);
            usuario.setProyectoCollection(proyectos);
        }
        pro.setColaboradorCollection(Ccolaboradores);

        proyectoFacade.edit(pro);
        for (Colaborador usuario : usuarios) {
            colaboradorFacade.edit(usuario);
        }
    }
}
